package com.recharge.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.recharge.common.domain.PageDO;
import com.recharge.common.enums.ErrorCode;
import com.recharge.common.result.ResultDO;
import com.recharge.common.result.ResultSupport;
import com.recharge.common.util.BeanUtilsExtends;
import com.recharge.common.util.Constant;
import com.recharge.core.entity.MerchantEntity;
import com.recharge.core.entity.ParamEntity;
import com.recharge.core.entity.ParamEntity;
import com.recharge.core.mapper.ParamMapper;
import com.recharge.domain.query.ParamQueryDO;
import com.recharge.domain.vo.MerchantDO;
import com.recharge.domain.vo.ParamDO;
import com.recharge.service.ParamService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.lang.reflect.Parameter;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * <p>
 * 系统参数 服务实现类
 * </p>
 *
 * @author reagan
 * @since 2020-08-19
 */
@Service
public class ParamServiceImpl extends ServiceImpl<ParamMapper, ParamEntity> implements ParamService {

    private Logger logger = LoggerFactory.getLogger(this.getClass().getName());

    @Transactional(propagation= Propagation.REQUIRED, rollbackFor= Exception.class)
    public ResultDO add(ParamDO domain) {

        ParamEntity entity = new ParamEntity();

        ResultDO result = BeanUtilsExtends.copy(entity, domain);
        if (!result.isSuccess()) {
            logger.debug("error code：" + result.getErrorCode().getCode() + " msg" + result.getErrorCode().getMsg());
            return result;
        }

        entity.setCreateDate(Calendar.getInstance().getTime());
        entity.setModifiDate(entity.getCreateDate());
        entity.setModifier(entity.getCreator());

        boolean res = false;
        try {
            res = this.save(entity);
        } catch(Exception e) {
            result.setSuccess(false);
            result.setErrorCode(ErrorCode.SYSTEM_EXCEPTION);
            logger.debug("error code：" + ErrorCode.SYSTEM_EXCEPTION.getCode() + " msg" + ErrorCode.SYSTEM_EXCEPTION.getMsg());
            return result;
        }

        //判断r的值是否小于0.如果小于0 就代表添加失败
        if(!res) {
            result.setSuccess(false);
            result.setErrorCode(ErrorCode.DICTIONARY_ADD_ERROR);
            logger.debug("error code：" + ErrorCode.DICTIONARY_ADD_ERROR.getCode() + " msg" + ErrorCode.DICTIONARY_ADD_ERROR.getMsg());
            return result;
        }

        return result;
    }

    @Transactional(propagation= Propagation.REQUIRED, rollbackFor= Exception.class)
    public ResultDO edit(ParamDO domain) {

        ParamEntity entity = new ParamEntity();

        ResultDO result = new ResultSupport();
        if (!result.isSuccess()) {
            logger.debug("error code：" + result.getErrorCode().getCode() + " msg" + result.getErrorCode().getMsg());
            return result;
        }

        entity.setModifiDate(Calendar.getInstance().getTime());
        entity.setName(domain.getName());
        entity.setValueData(domain.getValueData());

        QueryWrapper<ParamEntity> query = new QueryWrapper<>();
        query.lambda().eq(ParamEntity::getKeyed,domain.getKeyed());

        boolean res = false;
        try {
            //res = this.updateById(entity);
            res =this.update(entity,query);
        } catch (Exception e) {
            result.setSuccess(false);
            result.setErrorCode(ErrorCode.SYSTEM_EXCEPTION);
            logger.debug("error code：" + ErrorCode.SYSTEM_EXCEPTION.getCode() + " msg" + ErrorCode.SYSTEM_EXCEPTION.getMsg());
            e.printStackTrace();
            return result;
        }

        //判断r的值是否小于0.如果小于0 就代表添加失败
        if(!res) {
            result.setSuccess(false);
            result.setErrorCode(ErrorCode.DICTIONARY_EDIT_ERROR);
            logger.debug("error code：" + ErrorCode.DICTIONARY_EDIT_ERROR.getCode() + " msg" + ErrorCode.DICTIONARY_EDIT_ERROR.getMsg());
            return result;
        }

        return result;
    }

    
    public ResultDO get(String id) {

        ResultDO result = new ResultSupport();
        ParamEntity entity = null;

        QueryWrapper<ParamEntity> query = new QueryWrapper<>();
        query.lambda().eq(ParamEntity::getKeyed,id);

        try {
//            entity = this.getById(id);
            entity = this.baseMapper.selectOne(query);
        } catch(Exception e) {
            result.setSuccess(false);
            result.setErrorCode(ErrorCode.SYSTEM_EXCEPTION);
            logger.debug("error code：" + ErrorCode.SYSTEM_EXCEPTION.getCode() + " msg" + ErrorCode.SYSTEM_EXCEPTION.getMsg());
            return result;
        }

        ParamDO domain = getDomain(entity);

        result.setModel(ResultDO.FIRST_MODEL_KEY, domain);

        return result;
    }

    @Transactional(propagation= Propagation.REQUIRED, rollbackFor= Exception.class)
    public ResultDO remove(String id, String modifier) {
        ResultDO result = new ResultSupport();

        ParamEntity entity = new ParamEntity();

        entity.setModifiDate(Calendar.getInstance().getTime());
        entity.setModifier(modifier);
        //entity.setKeyed(id);
        entity.setIsDelete(Constant.IS_DELETE);

        QueryWrapper<ParamEntity> query = new QueryWrapper<>();
        query.lambda().eq(ParamEntity::getKeyed,id);
        boolean res = false;
        try {

            res = this.update(entity,query);
        } catch (Exception e) {
            result.setSuccess(false);
            result.setErrorCode(ErrorCode.SYSTEM_EXCEPTION);
            logger.debug("error code：" + ErrorCode.SYSTEM_EXCEPTION.getCode() + " msg" + ErrorCode.SYSTEM_EXCEPTION.getMsg());
            return result;
        }

        //判断r的值是否小于0.如果小于0 就代表添加失败
        if(!res) {
            result.setSuccess(false);
            result.setErrorCode(ErrorCode.DICTIONARY_DELETE_ERROR);
            logger.debug("error code：" + ErrorCode.DICTIONARY_DELETE_ERROR.getCode() + " msg" + ErrorCode.DICTIONARY_DELETE_ERROR.getMsg());
            return result;
        }

        return result;
    }

    
    public ResultDO find(ParamQueryDO query) {

        ParamEntity entity = new ParamEntity();
        ResultDO result = BeanUtilsExtends.copy(entity,query);
        if (!result.isSuccess()) {
            logger.debug("error code：" + result.getErrorCode().getCode() + " msg" + result.getErrorCode().getMsg());
            return result;
        }
        QueryWrapper<ParamEntity> queryWrapper = new QueryWrapper<ParamEntity>(entity);
        //有效的
        queryWrapper.lambda().eq(ParamEntity::getIsDelete, Constant.IS_DELETE_FALSE);
//        List<ParamEntity> list = null;
        Page<ParamEntity> page = new Page<>(query.getCurrentPage(),query.getPageSize());
        IPage iPage = null;
        try {
//            list = this.baseMapper.selectList(queryWrapper);
            iPage = this.baseMapper.selectPage(page,queryWrapper);
        } catch(Exception e) {
            e.printStackTrace();
            result.setSuccess(false);
            result.setErrorCode(ErrorCode.SYSTEM_EXCEPTION);
            logger.debug("error code：" + ErrorCode.SYSTEM_EXCEPTION.getCode() + " msg" + ErrorCode.SYSTEM_EXCEPTION.getMsg());
            return result;
        }

        List<ParamDO> doList = getDomainList(iPage.getRecords());

        PageDO<ParamDO> pageDO = new PageDO<>();
        pageDO.setCurrentPage(iPage.getCurrent());
        pageDO.setPageSize(iPage.getPages());
        pageDO.setRowCount(iPage.getSize());
        pageDO.setData(doList);

        result.setModel(ResultDO.FIRST_MODEL_KEY, pageDO);
        return result;
    }

    private ParamDO getDomain(ParamEntity entity) {

        //判断房源对象是否为空，为空就返回 空，不为空就进行下面的代码
        if(entity == null) return null;
        ParamDO domain = new ParamDO();

        domain = BeanUtilsExtends.copyProperties(domain, entity) ? domain : null;

        //判断拷贝数据到Dto对象是否成功，如果成功则返回domian，如果不成功就返回空
        return domain;
    }

    private List<ParamDO> getDomainList(List<ParamEntity> list) {
        //创建一个名为dolist的房源do类型的 list集合
        List<ParamDO> doList = new ArrayList<ParamDO>();

        //判断传入的list的集合的size是否大于0
        if(list.size() > 0) {
            //大于0是，遍历list，创建do类型的对象 调用getdomain方法
            for(ParamEntity entity : list) {

                ParamDO domain = this.getDomain(entity);

                //判断得到的domain 是否为空 不为空 就往dolist集合里面添加domian 为空就返回空
                if(domain == null) {
                    return null;
                }
                doList.add(domain);
            }
        } else {
            return null;
        }
        return doList;
    }
}
